Set是JavaScript ES6中新增的資料結構,Set與陣列很類似,允許任何型態的值,跟陣列不同的是所有的值都是唯一的,不允許有重複的值,因此很適合用來去除重複的值。
let set = new Set()
let set2 = new Set([1, 3, 5, 7]) //{1, 3, 5, 7}
Set.add(value)
set.add(1) // {1}
這邊要特別注意,因為set不允許有重複的值 ,所以重複add同個元素是不會有效果的
set.add(1) // {1}
set.add(1) // {1} 依然只有一個1
因為add會回傳set的本身,所以可以使用chaining(鏈)的寫法
set.add(1)
.add(2)
.add(3)
確認Set是否有該值,回傳boolean值
set.has(1) // return true
刪除該value,如果刪除成功會回傳true,失敗則是false
set.delete(1) // return true
回傳set的長度
let set = new Set()
set.add(1)
set.add(2)
set.add(3)
set.size; //3
清除set所有的內容,不會回傳值
set.clear()
let set = new Set([1, 3, 5])
set.keys() // {1, 3, 5}
set.values() // {1, 3, 5}
set.entires() // {1 => 1, 3 => 3, 5 => 5}
set.forEach((value, key)=>{console.log('value:', value, 'key:', key)})
let array = [...set]
let set = new Set(array)
所以藉由Set值不重複的特性,如果想去除重複的值可以這麼做
let arr = [1, 2, 2, 3, 1]
let set = new Set(arr) // {1, 2, 2, 3, 1}
let result = [...set] // [1, 2, 3]
或者想找出兩個陣列的聯集
let arr1 = [1, 2, 5, 7, 9]
let arr2 = [1, 3, 4, 7, 8]
let same = new Set([...arr1, ...arr2])
// {1, 2, 5, 7, 9, 3, 4, 8}
WeakSet結構類似於Set,但跟Set不同的是,不接受基本資料型態的值,只接受Object,沒有遍歷和size的方法,只有add、has、delete這三個方法可以使用,另外,WeakSet裡面的物件是Weakly Reference。
中文翻作弱引用,不會被垃圾回收機制計入參考,也就是說當其它物件不再參考該物件,就會被js的垃圾回收機制回收掉釋放記憶體,即使物件還在WeakSet裡面,可以必免memery leak(記憶體洩漏)的問題。
let weakSet = new WeakSet()
weakSet.add({})
weakSet.add([])
//{[], {}}
weakSet.add(5)
// TypeError: Invalid value used in weak set
參考資料: Set 和 Map 数据结构
文章有一個地方寫錯了:
或者想找出兩個陣列的交集(重複的元素)
let arr1 = [1, 2, 5, 7, 9]
let arr2 = [1, 3, 4, 7, 8]
let same = new Set([...arr1, ...arr2])
// {1, 2, 5, 7, 9, 3, 4, 8}
這個結果不是「交集」而是「聯集」
感謝大大刊誤
已修正